package com.example.vote.flow.service.impl;

import com.example.vote.flow.exception.ServiceException;
import com.example.vote.flow.mapper.VoteOptionMapper;
import com.example.vote.flow.mapper.VoteRecordMapper;
import com.example.vote.flow.mapper.VoteTopicMapper;
import com.example.vote.flow.pojo.core.Principle;
import com.example.vote.flow.pojo.entity.VoteOption;
import com.example.vote.flow.pojo.param.VoteOptionAddNewParam;
import com.example.vote.flow.pojo.param.VoteOptionUpdateParam;
import com.example.vote.flow.pojo.vo.VoteOptionFullVO;
import com.example.vote.flow.pojo.vo.VoteOptionSimpleVO;
import com.example.vote.flow.pojo.vo.VoteRecordVO;
import com.example.vote.flow.pojo.vo.VoteTopicSimpleVO;
import com.example.vote.flow.service.IVoteOptionService;
import com.example.vote.flow.web.StateCode;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class VoteOptionServiceImpl implements IVoteOptionService {

    @Autowired
    private VoteTopicMapper voteTopicMapper;
    @Autowired
    private VoteOptionMapper voteOptionMapper;
    @Autowired
    private VoteRecordMapper voteRecordMapper;

    @Override
    public void addNew(VoteOptionAddNewParam param, Principle principle) {
        // 获取投票主题ID
        Long voteTopicId = param.getVoteTopicId();
        // 根据ID查询投票主题简要信息
        VoteTopicSimpleVO voteTopic = voteTopicMapper.selectById(voteTopicId);

        // 如果投票主题不存在，则抛出异常
        if (voteTopic == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "投票主题不存在");
        }
        // 如果当前时间在投票主题开始时间之前，或结束时间之后，则抛出异常
        if (voteTopic.getStartTime().isAfter(LocalDateTime.now())) {
            throw new ServiceException(StateCode.ERROR_CONFLICT, "不可添加到已经开始的投票");
        }
        if (voteTopic.getEndTime().isBefore(LocalDateTime.now())) {
            throw new ServiceException(StateCode.ERROR_CONFLICT, "不可添加到已经结束的投票");
        }
        // 如果当前用户不是管理员且不是投票主题的创建者，则抛出异常，表示无权限操作
        if (principle.getIsAdmin() == 0 && voteTopic.getCreatorId().longValue() != principle.getId().longValue()) {
            throw new ServiceException(StateCode.ERROR_FORBIDDEN, "不可添加到他人创建的投票主题");
        }

        // 创建一个新的投票选项对象
        VoteOption voteOption = new VoteOption();
        // 将参数中的属性复制到投票选项对象中
        BeanUtils.copyProperties(param, voteOption);
        // 设置投票选项的记录数为0，表示初始状态无人投票
        voteOption.setRecordCount(0);
        // 如果投票主题不允许选项图片，则将投票选项的图片URL设置为null
        if (voteTopic.getAllowOptionImage() != 1) {
            voteOption.setImageUrl(null);
        }

        // 向数据库中插入新的投票选项
        voteOptionMapper.insert(voteOption);
    }

    @Override
    public void deleteById(Long id, Principle principle) {
        // 根据ID查询投票选项简要信息
        VoteOptionSimpleVO findResult = voteOptionMapper.selectById(id);
        // 如果投票选项不存在，则抛出异常
        if (findResult == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "投票选项不存在");
        }

        // 获取投票主题ID
        Long voteTopicId = findResult.getVoteTopicId();
        // 根据ID查询投票主题简要信息
        VoteTopicSimpleVO voteTopic = voteTopicMapper.selectById(voteTopicId);
        // 如果投票主题不存在，则抛出异常
        if (voteTopic == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "投票主题不存在");
        }
        // 如果当前时间在投票主题开始时间之前，或结束时间之后，则抛出异常
        if (voteTopic.getStartTime().isAfter(LocalDateTime.now())) {
            throw new ServiceException(StateCode.ERROR_CONFLICT, "不可删除已经开始的投票的选项");
        }
        if (voteTopic.getEndTime().isBefore(LocalDateTime.now())) {
            throw new ServiceException(StateCode.ERROR_CONFLICT, "不可删除已经结束的投票的选项");
        }
        // 如果当前用户不是管理员且不是投票主题的创建者，则抛出异常，防止删除他人创建的投票选项
        if (principle.getIsAdmin() == 0 && voteTopic.getCreatorId().longValue() != principle.getId().longValue()) {
            throw new ServiceException(StateCode.ERROR_FORBIDDEN, "不可删除他人创建的投票选项");
        }

        // 删除投票选项
        voteOptionMapper.deleteById(id);
    }

    @Override
    public void updateById(Long id, VoteOptionUpdateParam param, Principle principle) {
        // 根据ID查询投票选项简单信息
        VoteOptionSimpleVO findResult = voteOptionMapper.selectById(id);
        // 如果投票选项不存在，则抛出异常
        if (findResult == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "投票选项不存在");
        }

        // 获取投票主题ID
        Long voteTopicId = findResult.getVoteTopicId();
        // 根据ID查询投票主题简单信息
        VoteTopicSimpleVO voteTopic = voteTopicMapper.selectById(voteTopicId);
        // 如果投票主题不存在，则抛出异常
        if (voteTopic == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "投票主题不存在");
        }
        // 如果当前时间在投票主题开始时间之前，或结束时间之后，则抛出异常
        if (voteTopic.getStartTime().isAfter(LocalDateTime.now())) {
            throw new ServiceException(StateCode.ERROR_CONFLICT, "不可编辑已经开始的投票的选项");
        }
        if (voteTopic.getEndTime().isBefore(LocalDateTime.now())) {
            throw new ServiceException(StateCode.ERROR_CONFLICT, "不可编辑已经结束的投票的选项");
        }
        // 如果当前用户不是管理员且不是投票主题的创建者，则抛出异常
        if (principle.getIsAdmin() == 0 && voteTopic.getCreatorId().longValue() != principle.getId().longValue()) {
            throw new ServiceException(StateCode.ERROR_FORBIDDEN, "不可编辑他人创建的投票选项");
        }

        // 创建一个新的投票选项对象
        VoteOption voteOption = new VoteOption();
        // 将参数中的属性复制到投票选项对象中
        BeanUtils.copyProperties(param, voteOption);
        // 设置投票选项的ID
        voteOption.setId(id);
        // 如果投票主题不允许选项图片，则将图片URL设置为null
        if (voteTopic.getAllowOptionImage() != 1) {
            voteOption.setImageUrl(null);
        }

        // 更新投票选项信息
        voteOptionMapper.updateById(voteOption);
    }

    @Override
    public VoteOptionFullVO selectFullInfoById(Long id) {
        // 根据ID查询投票选项的简单信息
        VoteOptionSimpleVO findResult = voteOptionMapper.selectById(id);
        // 如果查询结果为空，则抛出异常，提示投票选项不存在
        if (findResult == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "投票选项不存在");
        }

        // 根据投票选项ID查询所有相关的投票记录
        List<VoteRecordVO> voteRecordList = voteRecordMapper.selectByVoteOptionId(id);

        // 创建一个完整的投票选项对象，用于封装投票选项的详细信息
        VoteOptionFullVO voteOptionFullVO = new VoteOptionFullVO();
        // 将查询到的简单信息复制到完整的投票选项对象中
        BeanUtils.copyProperties(findResult, voteOptionFullVO);
        // 将相关的投票记录设置到完整的投票选项对象中
        voteOptionFullVO.setRecordList(voteRecordList);

        // 返回完整的投票选项对象
        return voteOptionFullVO;
    }

}